#include <spdlog/spdlog.h>
#include <spdlog/sinks/basic_file_sink.h>
#include <spdlog/sinks/stdout_color_sinks.h>
#include <spdlog/async.h>
#include <iostream>

int main()
{
    // 每秒刷新一次日志
    spdlog::flush_every(std::chrono::seconds(1));

    // 设置全局日志等级为 debug
    spdlog::set_level(spdlog::level::debug);

    // 创建一个彩色控制台日志器
    auto console_sink = std::make_shared<spdlog::sinks::stdout_color_sink_mt>();

    // 创建一个文件日志器
    auto file_sink = std::make_shared<spdlog::sinks::basic_file_sink_mt>("async.log", true);

    // 设置日志输出格式
    console_sink->set_pattern("[%n] [%H:%M:%S] [%t] [%-8l] %v");
    file_sink->set_pattern("[%n] [%H:%M:%S] [%t] [%-8l] %v");

    // 初始化异步日志器的线程池
    spdlog::init_thread_pool(8192, 1);

    // 创建异步多目标日志器
    auto logger = std::make_shared<spdlog::async_logger>(
        "async-logger",
        spdlog::sinks_init_list{console_sink, file_sink},
        spdlog::thread_pool(),
        spdlog::async_overflow_policy::block
    );

    // 设置全局默认日志器
    spdlog::set_default_logger(logger);

    // 输出多级别日志
    logger->debug("你好 spdlog {}", "小丽");
    logger->trace("你好 spdlog {}", "小丽");
    logger->info("你好 spdlog {}", "小丽");
    logger->warn("你好 spdlog {}", "小丽");
    logger->error("你好 spdlog {}", "小丽");
    logger->critical("你好 spdlog {}", "小丽");

    // 程序结束前，确保日志刷新和关闭
    spdlog::shutdown();

    return 0;
}
